package com.yty.demo._8_genericity;

import java.util.List;

/**
 * @author: yangtaoyao
 * @time: 2020/1/14 15:17
 * @description: 泛型
 */
public class Test {
    public static void main(String[] args) {
        A<Integer> a=new A<>();
        a.setKey(3);
        System.out.println(a.getKey());

        A a1=new A();//不指定泛型，相当于指定了Object类型；
        a1.setKey("123");
        System.out.println(a1.getKey());


        Cc<String> cc=new Cc<>();
        //泛型方法在调用之前没有固定的数据类型；
        cc.test1(1);
        cc.test2(true);
        cc.test3(1,2,3);
        //泛型方法会在调用时确定泛型；

    }
}

/**
 * 泛型类
 * 未传入泛型实参时，与泛型类的定义相同，在什么类的时候，需讲泛型的声明也一起加到类中；
 */
//class A implements IA<T>{//如果不声明泛型，编译器会报错；
class A<T> implements IA<T>{
    private T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    @Override
    public T test(T t) {
        return t;
    }
}
/**
 * 泛型接口
 */
interface IA<T>{
    T test(T t);
}
/**
 * 泛型方法
 */
class Cc<E>{
    private E e;

    //在静态方法中，不能使用类定义泛型，如果要使用泛型，只能使用静态方法自己额外定义的泛型；
    public static <T> void teset4(T e){
        //System.out.println(this.e);//报错
    }

//    public static void teset5(E e){
//        System.out.println(this.e);//报错
//    }

    public <T> void test1(T s){
        T t=s;
    }

    public <T> T test2(T s){
        return s;
    }

    public <T> void test3(T... s){
        for (T t:s) {
            System.out.println(t);
        }
    }
}

/**
 * 使用通配符
 */
class Dd{
    public void test(List<?> list){//需要一个list集合的参数，不确定list集合到底是存的数据是什么类型；

    }
}